package database

import (
	"gorm.io/gorm"
)

// DBWrapper GORM 数据库封装
type DBWrapper struct {
	db *gorm.DB
}

// NewDB 创建数据库实例
func NewDB() DBWrapper {
	return DBWrapper{db: GetDB()}
}

// GetDB 获取原始 GORM DB 实例
func (d *DBWrapper) GetDB() *gorm.DB {
	return d.db
}

// Close 关闭数据库连接
func (d *DBWrapper) Close() error {
	if d.db == nil {
		return nil
	}
	sqlDB, err := d.db.DB()
	if err != nil {
		return err
	}
	return sqlDB.Close()
}

// 封装常用方法

// Create 创建记录
func (d *DBWrapper) Create(value interface{}) *gorm.DB {
	return d.db.Create(value)
}

// First 查询第一条记录
func (d *DBWrapper) First(dest interface{}, conds ...interface{}) *gorm.DB {
	return d.db.First(dest, conds...)
}

// Find 查询多条记录
func (d *DBWrapper) Find(dest interface{}, conds ...interface{}) *gorm.DB {
	return d.db.Find(dest, conds...)
}

// Where 条件查询
func (d *DBWrapper) Where(query interface{}, args ...interface{}) *gorm.DB {
	return d.db.Where(query, args...)
}

// Save 保存记录（会更新零值）
func (d *DBWrapper) Save(value interface{}) *gorm.DB {
	return d.db.Save(value)
}

// Updates 更新多个字段（不会更新零值）
func (d *DBWrapper) Updates(value interface{}) *gorm.DB {
	return d.db.Updates(value)
}

// Delete 删除记录
func (d *DBWrapper) Delete(value interface{}, conds ...interface{}) *gorm.DB {
	return d.db.Delete(value, conds...)
}

// Transaction 事务
func (d *DBWrapper) Transaction(fc func(tx *gorm.DB) error) error {
	return d.db.Transaction(fc)
}

// Begin 开始事务
func (d *DBWrapper) Begin() *gorm.DB {
	return d.db.Begin()
}

// Model 指定模型
func (d *DBWrapper) Model(value interface{}) *gorm.DB {
	return d.db.Model(value)
}

// Select 选择字段
func (d *DBWrapper) Select(query interface{}, args ...interface{}) *gorm.DB {
	return d.db.Select(query, args...)
}

// Order 排序
func (d *DBWrapper) Order(value interface{}) *gorm.DB {
	return d.db.Order(value)
}

// Limit 限制数量
func (d *DBWrapper) Limit(limit int) *gorm.DB {
	return d.db.Limit(limit)
}

// Offset 偏移量
func (d *DBWrapper) Offset(offset int) *gorm.DB {
	return d.db.Offset(offset)
}

// Count 计数
func (d *DBWrapper) Count(count *int64) *gorm.DB {
	return d.db.Count(count)
}

// Preload 预加载关联
func (d *DBWrapper) Preload(query string, args ...interface{}) *gorm.DB {
	return d.db.Preload(query, args...)
}

